home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / tools / developer-tools / andere sprachen / perl5 / perl5.002 / ext / dynaloader / dlutils.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-20  |  2.2 KB  |  97 lines

  1. /* dlutils.c - handy functions and definitions for dl_*.xs files
  2.  *
  3.  * Currently this file is simply #included into dl_*.xs/.c files.
  4.  * It should really be split into a dlutils.h and dlutils.c
  5.  *
  6.  */
  7.  
  8.  
  9. /* pointer to allocated memory for last error message */
  10. static char *LastError  = (char*)NULL;
  11.  
  12. /* flag for immediate rather than lazy linking (spots unresolved symbol) */
  13. static int dl_nonlazy = 0;
  14.  
  15. #ifdef DL_LOADONCEONLY
  16. static HV *dl_loaded_files = Nullhv;    /* only needed on a few systems */
  17. #endif
  18.  
  19.  
  20. #ifdef DEBUGGING
  21. static int dl_debug = 0;    /* value copied from $DynaLoader::dl_error */
  22. #define DLDEBUG(level,code)    if (dl_debug>=level) { code; }
  23. #else
  24. #define DLDEBUG(level,code)
  25. #endif
  26.  
  27.  
  28. static void
  29. dl_generic_private_init()    /* called by dl_*.xs dl_private_init() */
  30. {
  31.     char *perl_dl_nonlazy;
  32. #ifdef DEBUGGING
  33.     dl_debug = SvIV( perl_get_sv("DynaLoader::dl_debug", 0x04) );
  34. #endif
  35.     if ( (perl_dl_nonlazy = getenv("PERL_DL_NONLAZY")) != NULL )
  36.     dl_nonlazy = atoi(perl_dl_nonlazy);
  37.     if (dl_nonlazy)
  38.     DLDEBUG(1,fprintf(stderr,"DynaLoader bind mode is 'non-lazy'\n"));
  39. #ifdef DL_LOADONCEONLY
  40.     if (!dl_loaded_files)
  41.     dl_loaded_files = newHV(); /* provide cache for dl_*.xs if needed */
  42. #endif
  43. }
  44.  
  45.  
  46. /* SaveError() takes printf style args and saves the result in LastError */
  47. #ifdef STANDARD_C
  48. static void
  49. SaveError(char* pat, ...)
  50. #else
  51. /*VARARGS0*/
  52. static void
  53. SaveError(pat, va_alist)
  54.     char *pat;
  55.     va_dcl
  56. #endif
  57. {
  58.     va_list args;
  59.     char *message;
  60.     int len;
  61.  
  62.     /* This code is based on croak/warn, see mess() in util.c */
  63.  
  64. #ifdef I_STDARG
  65.     va_start(args, pat);
  66. #else
  67.     va_start(args);
  68. #endif
  69.     message = mess(pat, &args);
  70.     va_end(args);
  71.  
  72.     len = strlen(message) + 1 ;    /* include terminating null char */
  73.  
  74.     /* Allocate some memory for the error message */
  75.     if (LastError)
  76.         LastError = (char*)saferealloc(LastError, len) ;
  77.     else
  78.         LastError = safemalloc(len) ;
  79.  
  80.     /* Copy message into LastError (including terminating null char)    */
  81.     strncpy(LastError, message, len) ;
  82.     DLDEBUG(2,fprintf(stderr,"DynaLoader: stored error msg '%s'\n",LastError));
  83. }
  84.  
  85.  
  86. /* prepend underscore to s. write into buf. return buf. */
  87. char *
  88. dl_add_underscore(s, buf)
  89. char *s;
  90. char *buf;
  91. {
  92.     *buf = '_';
  93.     (void)strcpy(buf + 1, s);
  94.     return buf;
  95. }
  96.  
  97.